package com.xg.producer;

import jakarta.annotation.Resource;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;

@Service
public class RocketMQProducer {

    @Resource
    private RocketMQTemplate rocketMQTemplate;

    // 发送简单消息：将消息内容转换为指定的格式，然后发送到指定的消息队列。
    // 异步发送的，也就是说，发送消息后就立即返回并不等待对方的响应。
    public void sendMessage(String topic, String message) {
        rocketMQTemplate.convertAndSend(topic, message);
        System.out.println("Message sent: " + message);
    }

    // 同步发送，Producer 发出⼀条消息后，会在收到 MQ 返回的 ACK 之后才发下⼀条消息
    public void syncSendMsg(String topic, String message) {
        rocketMQTemplate.syncSend(topic, message);
    }

    // 异步类型消息，Producer 发出消息后无需等待 MQ 返回 ACK，直接发送下⼀条消息。
    public void asyncSendMessage(String topic, String message) {
        rocketMQTemplate.asyncSend(topic, message, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println("Async message sent: " + message);
            }

            @Override
            public void onException(Throwable e) {
                System.out.println("Async message error: " + e);
            }
        });
        System.out.println("Message sent: " + message);
    }

    // Producer 仅负责发送消息，不等待、不处理 MQ 的 ACK。该发送方式时 MQ 也不返回 ACK。该方式的消息发送效率最高，但消息可靠性较差。
    public void sendOneWayMessage(String topic, String message) {
        rocketMQTemplate.sendOneWay(topic, message);
        System.out.println("One way message sent: " + message);
    }

    // 发送顺序消息，严格按照消息的发送顺序进行消费的消息(FIFO)。
    public void sendOrderlyMessage(String topic, String message, String shardingKey) {
        for (int i = 0; i < 10; i++) {
            String orderlyMessage = message + i;
            rocketMQTemplate.syncSendOrderly(topic, orderlyMessage, shardingKey);
            System.out.println("Orderly message sent: " + orderlyMessage + " with shardingKey: " + shardingKey);
        }
    }

    // 发送延迟消息
    //延时消息的延迟时长不支持随意时长的延迟，是通过特定的延迟等级来指定的。
    // 延时等级默认有18个，可以在broker.conf中增加配置，然后重启broker
    // ＃ 延时等级
    //messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
    public void sendDelayedMessage(String topic, String message, int delayLevel) {
        rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(message).build(), 3000, delayLevel);
        System.out.println("Delayed message sent: " + message + " with delayLevel: " + delayLevel);
    }

    // 发送事务消息：保证发送方确认消息是否成功投递到服务端，并且只有在消费者成功处理完消息后才会通知服务端删除消息。
    public void sendTransactionalMessage(String topic, String transactionId, Object payload) {
    }

    // 批量消息

    // 消息过滤
}
